package Matrix;

/**
 * question:如何顺时针旋转一个矩阵
 * example:
 * 1,1 -> 2,1
 * 2,1    1,1
 *
 * @author Liaorun
 */
public class RotateMatrix {

    public static void main(String[] args) {
        int[][] ints = {{1, 1}, {2, 1}};

        rotate(ints);

        printMatrix(ints);
    }

    public static void rotate(int[][] matrix) {
        // 左上角的行
        int tR = 0;
        // 左上角的列
        int tC = 0;
        // 右上角的行
        int dR = matrix.length - 1;
        //右上角的列
        int dC = matrix[0].length - 1;
        // 跳出条件:左上角点行> 右下角点行坐标 ||  左上角的列 > 右上角的列
        while (tR <= dR && tC <= dC) {
            // 左上架点向右下方移动，同时右下角点向左上方移动
            rotateEdge(matrix, tR++, tC++, dR--, dC--);
        }
    }

    /**
     * @param matrix 矩阵
     * @param a      左上角的行
     * @param b      左上角的列
     * @param c      右上角的行
     * @param d      右上角的列
     */
    private static void rotateEdge(int[][] matrix, int a, int b, int c, int d) {

        // 处理的矩阵的边长
        int times = d - b;
        int tmp = 0;

        for (int i = 0; i < times; i++) {
            tmp = matrix[a][b + i];
            matrix[a][b + i] = matrix[c - i][b];
            matrix[c - i][b] = matrix[c][d - i];
            matrix[c][d - i] = matrix[a + i][d];
            matrix[a + i][d] = tmp;
        }
    }


    public static void printMatrix(int[][] matrix) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                System.out.print(matrix[i][j]);
            }

            System.out.println();
        }
    }
}
